package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpNoticeDAO;
import org.jsola.hr.dto.EmpNoticeAddDTO;
import org.jsola.hr.dto.EmpNoticeUpdateDTO;
import org.jsola.hr.entity.EmpNoticeDO;
import org.jsola.hr.query.EmpNoticeQuery;
import org.jsola.hr.vo.EmpNoticeListVO;
import org.jsola.hr.vo.EmpNoticeVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 员工通知
 *
 * @author zhr
 */
public interface IEmpNoticeService extends IService<IEmpNoticeDAO, EmpNoticeDO> {

    /**
     * 新增员工通知
     *
     * @param empNoticeAddDTO 新增员工通知DTO
     * @param tokenUser       当前用户
     * @return 员工通知详情信息
     */
    EmpNoticeVO save(EmpNoticeAddDTO empNoticeAddDTO, TokenUser tokenUser);

    /**
     * 修改员工通知
     *
     * @param empNoticeUpdateDTO 修改员工通知DTO
     * @param tokenUser          当前用户
     * @return 更新数量
     */
    int update(EmpNoticeUpdateDTO empNoticeUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工通知，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser    当前用户
     * @param empNoticeIds 员工通知id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empNoticeIds);

    /**
     * 根据员工通知id查找
     *
     * @param empNoticeId 员工通知id
     * @param tokenUser   当前用户
     * @return 员工通知详情信息
     */
    EmpNoticeVO selectById(String empNoticeId, TokenUser tokenUser);

    /**
     * 查询员工通知
     *
     * @param empNoticeQuery 查询条件
     * @param siteId         所属站点id
     * @return 员工通知列表信息
     */
    List<EmpNoticeListVO> select(EmpNoticeQuery empNoticeQuery, String siteId);

    /**
     * 查询员工通知记录数
     *
     * @param empNoticeQuery 查询条件
     * @param siteId         所属站点id
     * @return 员工通知记录数
     */
    int selectCount(EmpNoticeQuery empNoticeQuery, String siteId);

    /**
     * 分页查询员工通知
     *
     * @param empNoticeQuery 查询条件
     * @param siteId         所属站点id
     * @return 员工通知列表信息
     */
    Page<EmpNoticeListVO> selectPage(EmpNoticeQuery empNoticeQuery, String siteId);


    /**
     * 根据员工通知id查找
     *
     * @param empNoticeId 员工通知id
     * @param siteId      所属站点id
     * @return 员工通知
     */
    EmpNoticeDO selectDOById(String empNoticeId, String siteId);

    /**
     * 查询员工通知
     *
     * @param empNoticeQuery 查询条件
     * @param siteId         所属站点id
     * @return 员工通知列表
     */
    List<EmpNoticeDO> selectDO(EmpNoticeQuery empNoticeQuery, String siteId);

    /**
     * 获取个人通知列表,每人只展示最新的一条
     *
     * @param empNoticeQuery 查询条件
     * @param siteId         站点id
     * @return 个人通知, 每人只展示最新的一条
     */
    List<EmpNoticeListVO> listLastOneUserNotice(EmpNoticeQuery empNoticeQuery, String siteId);

    /**
     * 获取个人通知列表,每人只展示最新的一条,分页展示
     *
     * @param empNoticeQuery 查询条件
     * @param siteId         站点id
     * @return 个人通知, 每人只展示最新的一条
     */
    Page<EmpNoticeListVO> pageLastOneUserNotice(EmpNoticeQuery empNoticeQuery, String siteId);

    /**
     * 运行上线操作
     *
     * @param id        公告id
     * @param tokenUser 当前用户
     */
    void runOnline(String id, TokenUser tokenUser);

    /**
     * 运行下线操作
     *
     * @param id        公告id
     * @param tokenUser 当前用户
     */
    void runOffline(String id, TokenUser tokenUser);

    EmpNoticeListVO findUserNotice(String userNoticeId, TokenUser tokenUser);

    /**
     * 批量将用户通知置为已读
     *
     * @param tokenUser    当前用户
     * @param userNoticeId 通知id
     * @param empIds       员工id
     * @return 已读数量
     */
    void readUserNotice(TokenUser tokenUser, String userNoticeId, String... empIds);

}
